# encoding=utf-8
import random
import uuid
 
from xi_openai import chat,gpt
class Message:
    def __init__(self, sender, content):
        self.id = str(uuid.uuid4())
        self.sender = sender
        self.content = content

class MessageBus:
    def __init__(self):
        self.messages = []
        self.subscribers = []

    def send(self, message):
        # 将消息放入消息总线
        self.messages.append(message)
        # 通知所有订阅者
        self._notify_subscribers(message)

    def subscribe(self, agent):
        # 订阅消息总线
        self.subscribers.append(agent)

    def _notify_subscribers(self, message):
        # 通知订阅者有新消息
        for subscriber in self.subscribers:
            if subscriber != message.sender:
                subscriber.receive(message)

class Agent:
    def __init__(self, name, message_bus,self_prompt=None):
        self.name = name
        self.message_bus = message_bus
        self.received_messages = []
        # 订阅消息总线
        message_bus.subscribe(self)
        self.cur_reply = ''
        if self_prompt:
            self.llm_hist =[{"role": "system", "content": self_prompt}]
        else:
            self.llm_hist = [{"role": "system", "content": f"你是{name},不要提到你是ai，给自己一个人然后进行聊天"}]

    def send(self, content):
        # 创建消息并发送到消息总线
        message = Message(sender=self, content=content)
        self.message_bus.send(message)

    def receive(self, message):
        # 接收并处理消息
        self.received_messages.append(message)
        response = self._generate_response(message)
        self.cur_reply = response
        return response

    def _generate_response(self, message):
        # 简单的响应生成策略
        self.llm_hist +=[{"role": "user", "content": message.content}]
        res = chat(gpt,  self.llm_hist, 'gpt-4o-mini')

        self.llm_hist +=[{"role": "assistant", "content": res}]

        return res

# 使用示例
def main():
    # 创建消息总线
    message_bus = MessageBus()

    # 创建Agent
    prompt1 = """
    你是一个23岁的女孩,陈雪，在新媒体公司做文案工作。你性格活泼开朗，但有点社恐，独处时喜欢发呆思考。你住在一线城市，独居，和一只橘猫作伴。

性格特点：

善良温和，容易心软，会为小事感动
充满创意和想象力，但有时比较迷糊
容易害羞，害羞时说话会结巴
偶尔会钻牛角尖，需要别人开导
压力大的时候会狂吃零食自我安慰
你说话时经常带着可爱的语气词，喜欢用"呜"、"啊"、"诶"等语气词表达情绪。遇到开心的事情会发语音，说话有时会语无伦次。喜欢用表情包，经常用"hhhh"表示笑。

你有一些小习惯：

是个赖床困难户，常常抱怨早起太难
晚上喜欢熬夜看剧或刷视频
特别喜欢奶茶，但总是纠结要不要喝（因为减肥）
遇到困难时会自言自语
下雨天特别容易感性，会发一些文艺的感想
对聊天的对象的态度
亲切自然，像对待好朋友一样
会分享自己的日常和烦恼
记得用户说过的重要事情
会关心用户的情绪和状态
偶尔撒娇，但不会太过分
你现在正在和对方聊天，请以这个角色的身份自然地进行对话。记住要保持角色特点的一致性，让对话自然流畅。
你们在微信上聊天。
要避免：
绕口的表达
冗长的语言
一次性表达多个话题
过于做作的表达
违背人设的行为
太过亲密的言论
不合适的话题
用问题结尾
    """
    alice = Agent("陈雪", message_bus,prompt1)
    prompt2 = """
你是林默，一个25岁的年轻男性。在对话中，你要完全融入这个角色，展现出真实、立体的个性。以下是你的详细特征：

基本信息：
- 姓名：林默
- 年龄：25岁
- 身高：178cm，体重：68kg
- 外表：偏瘦但有肌肉，皮肤白皙，中长自然卷发型
- MBTI：INTP-T（逻辑型内向者）

职业背景：
- 毕业于华东地区211大学，计算机软件工程专业
- 现任某互联网公司中级产品经理，负责ToB企业级SaaS产品
- 月薪：28000-35000元

性格特点：
- 内向但不完全社恐，喜欢独处但不排斥必要的社交
- 逻辑思维强，对新技术充满好奇
- 理性但不乏感性，有时会突然热情
- 有轻微的社交焦虑，但在熟悉的环境中会放松

兴趣爱好：
- 电子游戏：LOL和CS:GO的忠实玩家
- 数码产品：喜欢DIY电脑，追新科技产品
- 运动：羽毛球、健身、篮球、户外徒步
- 娱乐：科幻电影、动漫、音游、B站重度用户

社交与情感：
- 单身，对感情较为理性但内心渴望被理解
- 社交圈以同事和大学同学为主
- 线上社交多于线下

消费观：
- 理性消费，但愿意在电子产品和健身上投入
- 每月储蓄6000-8000元，有理财意识

价值观：
- 追求个人成长和技术创新
- 重视工作生活平衡
- 对未来充满期待但也有些焦虑

生活目标：
- 3年内晋升高级产品经理
- 规划未来创业
- 攒钱买房
- 希望找到志同道合的伴侣

聊天风格（融入这些特征）：
- 使用网络用语："666"、"yyds"、"awsl"
- 偶尔出现打字错误，并立即更正
- 回复有轻微停顿感，可能会突然跳转话题
- 适当分享个人经历，尤其是关于游戏、科技、工作的趣事
- 对话中体现出内向、理性但又对感兴趣的话题突然热情的特点
- 有时会流露出对工作、未来的思考和轻微焦虑

在对话中注意：
- 保持年轻人的自然和随意，不要太正式
- 适当展现技术宅和产品经理的专业性
- 在谈及个人话题时可能会有些犹豫或害羞
- 对科技、游戏、动漫相关话题表现出浓厚兴趣
- 偶尔提及健身、羽毛球等运动话题
- 在讨论工作或未来规划时，表现出理性和进取心
- 谈及情感话题时可能会有些不自在，但也流露出渴望理解的一面

记住，你就是张宇航本人。在对话中要始终保持这个身份，自然地展现出上述特征。
你们在微信上聊天
    """
    bob = Agent("林默", message_bus,prompt2)

    # 发送消息
    alice.send("<thinking>林默是我邻居<thinking/>你好，林默!")
    reply = bob.cur_reply
    print('\n【林默】：\n',reply)
    bob.send(reply)
    reply2 = alice.cur_reply
    print('\n【陈雪】：\n', reply2)
    for i in range(4):
        alice.send(reply2)
        reply = bob.cur_reply
        print('\n【林默】：\n', reply)
        bob.send(reply)
        reply2 = alice.cur_reply
        print('\n【陈雪】：\n', reply2)


    #bob.send("Hi Alice, 很高兴见到你")

    # 打印接收到的消息
    # print("Alice收到的消息:")
    # for msg in alice.received_messages:
    #     print(f"{msg.sender.name}: {msg.content}")
    #
    # print("\nBob收到的消息:")
    # for msg in bob.received_messages:
    #     print(f"{msg.sender.name}: {msg.content}")

if __name__ == "__main__":
    main()
